package com.browsesoft.adapter;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Hashtable;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

import com.browsesoft.EntityManager;
import com.browsesoft.ExtendElement;
import com.browsesoft.htmlcomponent.HTMLBasicComponent;
import com.browsesoft.htmlcomponent.HTMLTableModel;
import com.browsesoft.user.User;

public class CalendarListModel implements HTMLTableModel {
	/**
	 * 对应的组件
	 */
	protected HTMLBasicComponent component = null;

	/**
	 * 所有当天的日程安排
	 */
	protected Object[] calendars = null;

	/**
	 * 登录用户
	 */
	protected User loginUser = null;

	/**
	 * 标题显示的长度
	 */
	protected int titleSize;

	/**
	 * 是否显示数字
	 */
	protected boolean number = false;

	/**
	 * 父id
	 */
	protected String parentID = null;

	/**
	 * 对应的编辑模板
	 */
	protected String form;

	public int getColumnCount() {
		return 4;
	}

	/**
	 * 得到列数
	 * 
	 * @param index
	 *            列号
	 * @return 列名
	 */
	public String getColumnName(int index) {
		return "";
	}

	/**
	 * 得到列的英文名
	 * 
	 * @param index
	 *            列号
	 * @return 列的英文名
	 */
	public String getColumnEname(int index) {
		return "";
	}

	public Object getDatas() {
		return null;
	}

	/**
	 * 得到行数
	 * 
	 * @return 行数
	 */
	public int getRowCount() {
		return calendars.length;
	}

	/**
	 * 得到某列的操作类型
	 * 
	 * @param col
	 *            列号
	 * @return 操作类型
	 */
	public String getType(int col) {
		// 如果是第2列
		if (col == 2) {
			return "link";
		}
		// 否则
		return "td";
	}

	public void setCondition(String condition) {
	}

	/**
	 * 修改单元值
	 * 
	 * @param td
	 *            要处理的元素
	 * @param doc
	 *            文档
	 * @param row
	 *            行数
	 * @param col
	 *            列数
	 */
	public void modifyCellValue(Element td, Document doc, int row, int col) {
		try {
			// 得到一条日历
			CalendarFormModel calendar = (CalendarFormModel) this.calendars[row];
			// 如果是第0列
			if (col == 0) {
				// 得到时间
				String time = (String) calendar.getAttributes()
						.get("starthour");
				// 如果有数字
				if (number) {
					// 时间前带数字
					time = this.getNumber(row) + time;
				}
				// 替换页面元素
				ExtendElement.replaceElementContext(td, doc
						.createTextNode(time));
			}
			// 否则,是第1列
			else if (col == 1) {
				// 得到地点
				String location = (String) calendar.getAttributes().get(
						"actionplace");
				// 替换页面元素
				ExtendElement.replaceElementContext(td, doc
						.createTextNode(location));
			}
			// 否则,是第2列
			else if (col == 2) {
				// 得到元素
				Element e = (Element) ExtendElement.findElements(td, "type",
						"link").get(0);
				// 得到onclick
				String str = e.getAttribute("onclick");
				str = str.replaceAll("id=", "id=" + calendar.getID());
				str = str.replaceAll("templatename=", "templatename=" + form);
				e.setAttribute("onclick", str);
				// 得到标题
				String title = (String) calendar.getAttributes().get("title");
				// 如果标题字数大于指定的字数
				if (title.length() > titleSize) {
					// 对显示不全的标题后加点
					title = title.substring(0, titleSize - 3) + "...";
				}
				// 得到context元素
				Element context = (Element) e.getElementsByTagName("context")
						.item(0);
				// 替换页面元素
				ExtendElement.replaceElementContext(context, doc
						.createTextNode(title));
			}
			// 否则,是第3列
			else if (col == 3) {
				// 得到紧急程度
				String urgency = (String) calendar.getAttributes().get(
						"urgency");
				// 替换页面元素
				ExtendElement.replaceElementContext(td, doc
						.createTextNode(urgency));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 初始化
	 * 
	 * @param request
	 *            请求
	 * @throws Exception
	 */
	public void init(HttpServletRequest request) throws Exception {
		// 得到登录用户
		loginUser = (User) request.getSession().getAttribute("loginUser");
		// 得到组件元素
		Element e = this.component.getElement();
		form = e.getAttribute("form");
		// 设置标题字数
		this.titleSize = Integer.parseInt(e.getAttribute("titlesize"));
		// 得到显示数字
		String number = e.getAttribute("number");
		// 如果数字为空
		if (number == null || number.equals("")) {
			this.number = true;
		}
	}

	/**
	 * 处理客户端请求
	 * 
	 * @param request
	 *            请求
	 * @param response
	 *            响应
	 * @throws Exception
	 */
	public void service(HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		// 得到用户id号
		String userID = loginUser.getID();
		// 如果日期为空
		if (parentID == null) {
			// 得到point
			parentID = request.getParameter("point");
		}
		Hashtable ht = new Hashtable();
		// 添加用户id
		ht.put("userid", userID);
		// 如果有日期
		if (parentID != null) {
			// 添加日期
			ht.put("parentid", parentID);
		}
		// 得到符合条件的实体
		this.calendars = EntityManager.getInstance().getObjects(
				"com.browsesoft.adapter.CalendarFormModel", ht).toArray();
		// 按时间倒序排列
		Arrays.sort(calendars, new CalendarComparator());
	}

	/**
	 * 得到行数数字
	 * 
	 * @param rows
	 *            行数
	 * @return 行数数字
	 */
	protected String getNumber(int rows) {
		// 得到行数
		String result = Integer.toString(++rows);
		return result + ".";
	}

	/**
	 * 设置model对应的组件
	 * 
	 * @param component
	 *            对应的组件
	 */
	public void setComponent(HTMLBasicComponent component) {
		this.component = component;
	}

	public void updatePageElement(HTMLBasicComponent c) throws Exception {
	}

	/**
	 * 待办的比较
	 */
	class CalendarComparator implements Comparator {
		/**
		 * 两个对象比较
		 * 
		 * @param o1
		 *            对象1
		 * @param o2
		 *            对象2
		 * @return 比较结果
		 */
		public int compare(Object o1, Object o2) {
			CalendarFormModel c1 = (CalendarFormModel) o1;
			CalendarFormModel c2 = (CalendarFormModel) o2;
			// 开始时间
			String h1 = ((String) c1.getAttributes().get("starthour"))
					.substring(0, 2);
			String h2 = ((String) c2.getAttributes().get("starthour"))
					.substring(0, 2);
			int t1 = Integer.parseInt(h1);
			int t2 = Integer.parseInt(h2);
			return t1 - t2;
		}
	}
}